/* Copyright (C) 2003 by Peter Eastman

   This program is free software; you can redistribute it and/or modify it under the
   terms of the GNU General Public License as published by the Free Software
   Foundation; either version 2 of the License, or (at your option) any later version.

   This program is distributed in the hope that it will be useful, but WITHOUT ANY 
   WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A 
   PARTICULAR PURPOSE.  See the GNU General Public License for more details. */

package artofillusion.image;

import artofillusion.*;
import artofillusion.math.*;
import java.io.*;

/** This class generates .hdr image files. */

public class HDREncoder
{
  /** Write out the data for an image to a stream. */

  public static void writeImage(ComplexImage img, OutputStream out) throws IOException
  {
    int rows = img.getHeight(), cols = img.getWidth();
    RGBColor color = new RGBColor();
    PrintWriter pw = new PrintWriter(new OutputStreamWriter(out));
    boolean hasAlpha = img.hasFloatData(ComplexImage.ALPHA);

    pw.print("#?RADIANCE\n");
    pw.print("# Generated by Art of Illusion "+ArtOfIllusion.getVersion()+"\n");
    pw.print("FORMAT=32-bit_rle_rgbe\n");
    pw.print("\n");
    pw.print("-Y "+rows+" +X "+cols+"\n");
    pw.flush();
    for (int i = 0; i < rows; i++)
      for (int j = 0; j < cols; j++)
        {
          float red = img.getPixelComponent(j, i, ComplexImage.RED);
          float green = img.getPixelComponent(j, i, ComplexImage.GREEN);
          float blue = img.getPixelComponent(j, i, ComplexImage.BLUE);
          if (hasAlpha)
            {
              float alpha = img.getPixelComponent(j, i, ComplexImage.ALPHA);
              red *= alpha;
              green *= alpha;
              blue *= alpha;
            }
          color.setRGB(red, green, blue);
          int ergb = color.getERGB();
          out.write((ergb>>16)&0xFF);
		  out.write((ergb>>8)&0xFF);
		  out.write(ergb&0xFF);
		  out.write((ergb>>24)&0xFF);
        }
    out.flush();
  }
}
